﻿#include "widget.h"
#include "ui_widget.h"
#include <QSqlDatabase>
#include <QtDebug>
#include <QMessageBox>
#include <QSqlError>
#include <QSqlQuery>
#include <QVariantList>
#include <QSqlQueryModel>
#include <QSqlRecord>
#include <QSqlTableModel>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");//添加MySql数据库

    //连接数据库
    db.setHostName("127.0.0.1");//数据库服务器IP
    db.setPort(3306);
    db.setUserName("root");//数据库用户名
    db.setPassword("123456");//密码
    db.setDatabaseName("exam");//使用的数据库

    //打开数据库
    if(!db.open())
    {
        QMessageBox::warning(this,"错误",db.lastError().text());
        return;
    }
    else
    {
        qDebug() << "打开了";
    }

    m_pModel = new QStandardItemModel(20,5);//实例化 20行5列
    m_pModel->setHorizontalHeaderLabels(QStringList() << "id" << "姓名" << "职位" << "年龄" << "工资");

    ui->tableView->setModel(m_pModel);//表格实例化
    ui->tableView->setAlternatingRowColors(true);//隔行变色
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//拉伸
    //ui->tableView->horizontalHeader()->setStretchLastSection(true);//贴边

    QSqlQuery query(db);//绑定要访问的数据库
    /*********************************************创建数据库表student***********************************************
    * id int 整型、关键字 工号
    * name varchar(255) 字符型 姓名
    * position varchar(255) 字符型 姓名
    * age int 整型 年龄
    * salsry int 整型 工资
    **************************************************************************************************************/
    query.exec(" create table worker(id int primary key auto_increment, name varchar(255) , position varchar(255), age int, salary int);");

    query.exec(" insert into worker(id, name, position, age, salary) values(001, '傲天', '实习生', 20, 1500);");//插入单条数据

    /*************************************************批量插入数据******************************************************/

    /*********************************************oracle风格批量插入数据**************************************************/

    //预处理语句：占位符： +自定义名字
    query.prepare(" insert into worker(id, name, position, age, salary) values(:id, :name, :position, :age, :salary);");
    QVariantList idList,nameList,positionList,ageList, salaryList;//给字段设置内容 list
    //给字段设置内容 list
    idList << 002 << 123 << 125;
    nameList << "张三" << "李四" << "王五";
    positionList << "实习生" << "行政总监" << "项目负责人";
    ageList <<22 <<35 <<20;
    salaryList << 1500 << 6000 << 5000;
    //给字段绑定相应的值,按顺序绑定；id号自动添加
    query.addBindValue(idList);
    query.addBindValue(nameList);
    query.addBindValue(positionList);
    query.addBindValue(ageList);
    query.addBindValue(salaryList);
    //执行预处理命令
    query.execBatch();

    /***********************************************oracle风格批量插入数据*************************************************/

    query.exec("select * from worker");//从表中遍历每一行
    while(query.next())//一行一行遍历
    {
        QString id = tr("%1").arg(query.value(0).toInt());
        ui->comboBox_1->addItem(id);//取出当前行的内容
    }
    QStringList strList;
    strList<<"姓名"<<"职位"<<"年龄"<<"工资";
    ui->comboBox_2->addItems(strList);



}

Widget::~Widget()
{
    delete ui;
}

/*************************************************
  Function:       on_pushButton_clicked
  Description:    建立模型将数据库的数据导入到表格中
  Called By:      on_buttonDel_clicked()//删
                  on_buttonSel_clicked()//查
                  on_buttonIns_clicked()//增
                  on_buttonUpd_clicked()//改
  Table Accessed: worker
  Table Updated:  worker
  Output:         在QTableView上显示数据库信息
*************************************************/
void Widget::on_pushButton_clicked()
{
    static QSqlQueryModel *mode  = new QSqlQueryModel(ui->tableView);//建立一个Model
    mode->setHeaderData(0,Qt::Horizontal,QObject::tr("ID"));//模型头部
    mode->setHeaderData(1,Qt::Horizontal,QObject::tr("姓名"));
    mode->setHeaderData(2,Qt::Horizontal,QObject::tr("职位"));
    mode->setHeaderData(3,Qt::Horizontal,QObject::tr("年龄"));
    mode->setHeaderData(4,Qt::Horizontal,QObject::tr("工资"));
    mode->setQuery(QString("select * from worker"));
    mode->sort(1,Qt::AscendingOrder);//根据某个特定的顺序排列下来--此处好像不对
//    QTableView *view = new QTableView;//新建一个表界面
//    view->setModel(mode);
//    view->show();
//    view->resize(600,600);
    ui->tableView->setModel(mode);

}

/*************************************************
  Function:on_buttonDel_clicked()
  Description:当删除按钮点击后删除指定人姓名
  Calls: on_pushButton_clicked（），用于QTableView刷新
  Table Accessed:worker
  Table Updated:worker
  Input:在输入框输入要删除的人名
  Output:输出删除后QTableView
*************************************************/
void Widget::on_buttonDel_clicked()
{
    QString name = ui->lineEdit->text();//获取行编辑内容
    QString delsql = QString("delete from worker where name = '%1'").arg(name);//注意里面最后不带；号
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;//绑定要访问的数据库
    query.exec(delsql);
    QSqlDatabase::database().commit(); //执行删除
    on_pushButton_clicked();//刷新表格
}

/*************************************************
  Function:on_buttonSel_clicked()
  Description:当查找按钮点击后查找指定人姓名
  Calls: on_pushButton_clicked（），用于QTableView刷新
  Table Accessed:worker
  Table Updated:worker
  Input:在输入框输入要查找的人名
  Output:通过QMessageBox输出查找到的信息
*************************************************/
void Widget::on_buttonSel_clicked()
{
    QString name = ui->lineEdit_2->text();//获取行编辑内容
    QString selsql = QString("select * from worker where name = '%1'").arg(name);//注意里面最后不带；号
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;//绑定要访问的数据库
    query.exec(selsql);
    while(query.next())//一行一行遍历
    {
        //取出当前行的内容,取得时候按列来取
        QString inf = "ID:" + query.value(0).toString() + " 姓名：" + query.value(1).toString()
                + " 职位：" + query.value(2).toString() + " 年龄" + query.value(3).toString()
                + " 工资：" + query.value(4).toString();
        QMessageBox::information(this,tr("结果") ,inf);

    }
}

/*************************************************
  Function:on_buttonIns_clicked()
  Description:当添加按钮点击后添加相应数据
  Calls: on_pushButton_clicked（），用于QTableView刷新
  Table Accessed:worker
  Table Updated:worker
  Input:在五个输入框输入相应的新增信息
  Output:输出添加后新的表格数据
*************************************************/
void Widget::on_buttonIns_clicked()
{
    QString id = ui->l_Id->text();//获取行编辑内容
    QString name = ui->l_Name->text();
    QString position = ui->l_Position->text();
    QString age = ui->l_Age->text();
    QString salary = ui->l_Salary->text();
    QString inssql = QString("insert into worker(id, name, position, age, salary) values('%1','%2','%3','%4','%5')")
            .arg(id, name, position, age, salary);//注意里面最后不带；号
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;//绑定要访问的数据库
    if(query.exec(inssql))
    {
        QString id = tr("%1").arg(query.value(0).toInt());
        ui->comboBox_1->addItem(id);//取出当前行的内容
    }
    QSqlDatabase::database().commit(); //执行
    on_pushButton_clicked();//刷新表格
}

/*************************************************
  Function:on_buttonUpd_clicked()
  Description:当修改按钮点击后修改指定ID下的指定内容
  Calls: on_pushButton_clicked（），用于QTableView刷新
  Table Accessed:worker
  Table Updated:worker
  Input:在下拉框选中指定修改信息，在输入框输入修改后的值
  Output:输出修改后新的表格数据
*************************************************/
void Widget::on_buttonUpd_clicked()
{
    QString temp_1 = ui->comboBox_1->currentText();//获取下拉框内容
    QString temp_2 = ui->comboBox_2->currentText();
    QString temp_3 = ui->lineEdit_3->text();//获取输入框内容
    QString upsql;
    if(temp_2 == "姓名")
    {
        upsql = QString("update worker set name = '%1' where id = '%2'").arg(temp_3,temp_1);//注意里面最后不带；号
    }
    else if(temp_2 == "职位")
    {
        upsql = QString("update worker set position = '%1' where id = '%2'").arg(temp_3,temp_1);//注意里面最后不带；号
    }
    else if(temp_2 == "年龄")
    {
        upsql = QString("update worker set age = '%1' where id = '%2'").arg(temp_3,temp_1);//注意里面最后不带；号
    }
    else if(temp_2 == "工资")
    {
        upsql = QString("update worker set salary = '%1' where id = '%2'").arg(temp_3,temp_1);//注意里面最后不带；号
    }
    //开启一个事务
    QSqlDatabase::database().transaction();
    QSqlQuery query;//绑定要访问的数据库
    query.exec(upsql);
    QSqlDatabase::database().commit(); //执行
    on_pushButton_clicked();//刷新表格
}
